<?php if (!defined('INDEX')) { trigger_error("Index is not defined!", E_USER_ERROR); exit(); }
/**
 * Класс-обёртка для сервиса закладок Google Bookmarks. Необходима обязательная
 * авторизация в браузере. Т.е. в консольной версии работать не будет.
 *
 * @package      habrabookmarks
 *
 * @author       Max Kamashev <max.kamashev@floscoeli.com>
 * @copyright    floscoeli.com ©2009
 * @license      http://opensource.org/licenses/gpl-3.0.html
 * @version      SVN: $Id: GoogleBookmarks.service.php 29 2009-03-18 06:55:55Z M.Kamashev $
 *
 * settings:     ts: 4 spaces, eof: lf (unix), codepage: UTF-8
 */
class GoogleBookmarks extends Service {

    /**
     * Экспортировать одновременно множество закладок в XML файле, отправляя
     * файл методом POST. Этот метод очень быстрый, но имеет существенный
     * недостаток - не экспортируется описание закладки (annotation или description)
     * По умолчанию - FALSE
     * @var bool
     * @access public
     */
    public $mutliply = FALSE;

    /**
     * Можно экспортировать закладки
     * @access public
     * @var bool
     */
    public $export = FALSE;

    /**
     * Можно импортировать закладки
     * @access public
     * @var bool
     */
    public $import = FALSE;

    /**
     * Конструктор класса
     * @return void
     */
    public function __construct() {

    }

    /**
     * @see services/Service#description()
     */
    public function description() {
       return "Сервис закладок от Google. Доступен по адресу <a href='http://google.ru/bookmarks/'>google.ru/bookmarks/</a>.";
    }

    /**
     * @see services/Service#help()
     */
    public function help() {
        return "";
    }

    /**
     * @see services/Service#importFormRender()
     */

    public function importFormRender() {
        return "<form>importFormRender</form>";
    }

    /**
     * @see services/Service#exportFormRender()
     */
    public function exportFormRender() {
         return "<form>exportFormRender</form>";
    }

    /**
     * @see services/Service#exportValidate()
     */
    public function exportValidate() {

    }

    /**
     * @see services/Service#importValidate()
     */
    public function importValidate() {

    }
    /**
     * Создаёт из массива закладок объект DOMDocument и потом преобразует его в XML
     * Это очень быстрый способ импортировать много закладок одновременно, но
     * имеет одно ограничение - нет описания закладки. (и не стоит забывать что
     * дата в google bookmarks не импортируется вообще никак)
     * @param mixed array $bookmarks
     * @access private
     * @return string || FALSE - в случае ощибки
     */
    private function buildXML($bookmarks = array()) {
        if (count($bookmarks) == 0) {
            return FALSE;
        }

        // Формируем XML содержимое списка закладок
        $dom = new DOMDocument();
        $dom_bookmarks = $dom->appendChild(new DOMElement('bookmarks'));
        foreach ($bookmarks as $bookmark) {
            $dom_bookmark = $dom_bookmarks->appendChild(new DOMElement('bookmark'));
            $dom_bookmark->appendChild(new DOMElement('url', $bookmark['link']));
            $dom_bookmark->appendChild(new DOMElement('title', $bookmark['header']));
            $labels = $bookmark->appendChild(new DOMElement('labels'));
            foreach ($bookmark['tags'] as $tag) {
                $labels->appendChild(new DOMElement('label', $tag));
            }
        }
        return $dom->saveXML();
    }

    /**
     * Добавить закладку
     * @param string $link Ссылка
     * @param string $header Заголовок
     * @param string $descr Описание поста
     * @param array $tags Массив тегов
     * @param date $date Дата добавления поста, в mysql-формате YYYY-MM-DD HH:MM:SS
     * @access private
     * @return bool
     */
    private function add($bookmarks = array(), $link='', $header='', $descr='', $tags=array(), $date='') {
        // Собираем строку запроса для добавления закладки
        // Не официальная страничка API http://lnkr.mobi/lnkr/google_bookmarks_api/

        // Инициализируем curl
        $curl = curl_init();

        $cmd = "http://www.google.com/bookmarks/mark?op=upload";
        if ($this->multiply){
            print '<pre>';
            $data='<?xml version="1.0" encoding="utf-8"?>'.$this->buildXML($bookmarks);
            die($data.'</pre>');
            curl_setopt_array($curl,
                array(
                    CURLOPT_URL => $cmd,
                    CURLOPT_POST => 1,
                    CURLOPT_POSTFIELDS, $data,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_USERAGENT => $this->user_agent,
                    CURLOPT_CONNECTTIMEOUT => $this->timeout,
                    CURLOPT_TIMEOUT => $this->transfer_timeout,
                    CURLOPT_DNS_CACHE_TIMEOUT => $this->dns_timeout,
                )
            );
        } else {
            $cmd .= "&url=".urlencode($link);
            $cmd .= "&description=".urlencode($header);
            $cmd .= "&extended=".urlencode($descr);
            $cmd .= "&tags=".urlencode(implode(' ', $tags));
            curl_setopt_array($curl,
                array(
                    CURLOPT_URL => $cmd,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_USERAGENT => $this->user_agent,
                    CURLOPT_CONNECTTIMEOUT => $this->timeout,
                    CURLOPT_TIMEOUT => $this->transfer_timeout,
                    CURLOPT_DNS_CACHE_TIMEOUT => $this->dns_timeout,
                )
            );
        }

        if ($result = curl_exec($curl)) {
            switch (curl_getinfo($curl, CURLINFO_HTTP_CODE)) {
                case 200:
                    return $result;
                    break;
                case 401:
                    trigger_error("GoogleBookmarks: Указан не верный логин или пароль", E_USER_NOTICE);
                    break;
                case 503:
                    trigger_error("GoogleBookmarks: Успокойтесь и поставьте бОльшую задержку!", E_USER_NOTICE);
                default:
                    trigger_error("GoogleBookmarks: Ошибка соединения", E_USER_NOTICE);
            }
        }
        curl_close($curl);
        return FALSE;
    }

    /**
     * Метод для экспорта закладок в сервис delicious
     *
     * @param array mixed $bookmarks Массив с закладками
     * @return bool
     */
    public function exportBookmarks($bookmarks) {
        if (count($bookmarks) == 0) {
            trigger_error("GoogleBookmarks: Нет закладок для экспорта.", E_USER_NOTICE);
        }
        // Импортируем закладки одним XML-файлом, через метод POST
        if ($this->mutliply) {

        // Имортируем по одной закладке (медленный метод, но зато импортируется описания закладок)
        } else {
            foreach ($bookmarks as $bookmark) {
                if ( $this->add($bookmarks, $bookmark['link'], $bookmark['header'],
                    $bookmark['descr'],$bookmark['tags'],$bookmark['date']) ) {
                        trigger_error('GoogleBookmarks: Добавили закладку "'.$bookmark['header'].'"', E_USER_NOTICE);
                }
                sleep($this->delay);
            }
            return TRUE;
        }
    }


    /**
     * @see services/Service#importBookmarks()
     */
    public function importBookmarks() {
    }
}